Base de datos: https://datos.madrid.es/portal/site/egob
Documentación: https://python-visualization.github.io/folium/
import pandas as pd
import folium
from folium import plugins
import webbrowser
accidentes_df = pd.read_csv('2020_Accidentalidad.csv')
# Es opcional colocar el tipo de separador y la codificación. Por defecto es , y UTF-8 peró hay ficheros csv
# con formato sep=';', encoding = 'cp1252')
accidentes_df.head(10)
| num_expediente | fecha | hora | localizacion | numero | distrito | tipo_accidente | estado_meteorológico | tipo_vehiculo | tipo_persona | rango_edad | sexo | lesividad | coordenada_x_utm | coordenada_y_utm | positiva_alcohol | positiva_droga | longitud | latitud | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2019S040008 | 07/09/2020 | 23:00:00 | CALL. SAN MAXIMILIANO, 38 | 38 | CIUDAD LINEAL | Choque contra obstáculo fijo | Despejado | Turismo | Conductor | De 21 a 24 años | Hombre | NaN | 444597.85 | 4475156.03 | N | NaN | -3.653110 | 40.425193 |
| 1 | 2019S040008 | 07/09/2020 | 23:00:00 | CALL. SAN MAXIMILIANO, 38 | 38 | CIUDAD LINEAL | Choque contra obstáculo fijo | Despejado | VMU eléctrico | Conductor | De 25 a 29 años | Mujer | NaN | 444597.85 | 4475156.03 | N | NaN | -3.653110 | 40.425193 |
| 2 | 2020S000001 | 01/01/2020 | 1:15:00 | AVDA. CANILLEJAS A VICALVARO / CALL. SILFIDE | 1 | SAN BLAS-CANILLEJAS | Colisión fronto-lateral | NaN | Turismo | Conductor | De 18 a 20 años | Hombre | NaN | 447710.62 | 4477155.83 | N | NaN | -3.616582 | 40.443410 |
| 3 | 2020S000001 | 01/01/2020 | 1:15:00 | AVDA. CANILLEJAS A VICALVARO / CALL. SILFIDE | 1 | SAN BLAS-CANILLEJAS | Colisión fronto-lateral | NaN | Turismo | Conductor | De 30 a 34 años | Hombre | NaN | 447710.62 | 4477155.83 | S | NaN | -3.616582 | 40.443410 |
| 4 | 2020S000002 | 01/01/2020 | 1:20:00 | CALL. SILVANO, 31 | 31 | HORTALEZA | Choque contra obstáculo fijo | Despejado | Turismo | Conductor | De 21 a 24 años | Hombre | NaN | 445076.26 | 4478372.07 | N | NaN | -3.647749 | 40.454197 |
| 5 | 2020S000002 | 01/01/2020 | 1:20:00 | CALL. SILVANO, 31 | 31 | HORTALEZA | Choque contra obstáculo fijo | Despejado | Turismo | Pasajero | De 40 a 44 años | Hombre | NaN | 445076.26 | 4478372.07 | N | NaN | -3.647749 | 40.454197 |
| 6 | 2020S000003 | 01/01/2020 | 2:00:00 | CALL. BRAVO MURILLO, 1 | 1 | CHAMBERÍ | Alcance | Despejado | Turismo | Conductor | De 40 a 44 años | Hombre | NaN | 440242.56 | 4476174.20 | N | NaN | -3.704545 | 40.434064 |
| 7 | 2020S000003 | 01/01/2020 | 2:00:00 | CALL. BRAVO MURILLO, 1 | 1 | CHAMBERÍ | Alcance | Despejado | Turismo | Conductor | De 70 a 74 años | Hombre | NaN | 440242.56 | 4476174.20 | S | NaN | -3.704545 | 40.434064 |
| 8 | 2020S000003 | 01/01/2020 | 2:00:00 | CALL. BRAVO MURILLO, 1 | 1 | CHAMBERÍ | Alcance | Despejado | Turismo | Pasajero | De 40 a 44 años | Mujer | NaN | 440242.56 | 4476174.20 | N | NaN | -3.704545 | 40.434064 |
| 9 | 2020S000004 | 01/01/2020 | 1:00:00 | CALL. MANDARINA, 5 | 5 | CIUDAD LINEAL | Choque contra obstáculo fijo | Despejado | Furgoneta | Conductor | Desconocido | Desconocido | NaN | 445416.48 | 4476669.75 | N | NaN | -3.643590 | 40.438884 |
# Crear una nueva Dataframe que cumple las condiciones establecidas
acci_df=accidentes_df.loc[(accidentes_df['tipo_persona']=='Conductor')]
# Si quisieramos introduccir más condicionantes --- & (accidentes_df['tipo_vehiculo']=='Turismo')& (accidentes_df['rango_edad']=='De 18 a 20 años')]
Los mapas puntuales permiten plasmar variables georeferenciadas, para un mejor entendimiento por parte del usuario de la distribucción de los mismas.
Diferentes plugins de Folium: https://python-visualization.github.io/folium/plugins.html
Iconos con prefijo 'fa': https://fontawesome.com/v5.15/icons?d=gallery&p=2&m=free
from folium import plugins
# Crear el mapa base donde representar
mapa_accidentes = folium.Map(location=(40.43,-3.65), tiles = 'Stamen Terrain', zoom_start = 12)
# Crear diferentes dataframes
coche_df=acci_df.loc[(acci_df['tipo_vehiculo']=='Turismo')]
bici_df=acci_df.loc[(acci_df['tipo_vehiculo']=='Bicicleta')]
# crear un objeto de grupo de marcas para los incidentes en el DataFrame
coches = plugins.MarkerCluster( name="Accidentes_coche",).add_to(mapa_accidentes)
bicis = plugins.MarkerCluster( name="Accidentes_bicis",).add_to(mapa_accidentes)
# procesar el DataFrame y agregar cada punto de datos al grupo de marcas creado anteriormente
for lat, lng, label, in zip(coche_df.latitud, coche_df.longitud, coche_df['num_expediente']): #dos formas diferentes de llamar a un campo
folium.Marker(
location=[lat, lng],
icon=folium.Icon(color="orange", icon="car", prefix = 'fa'),
popup=label,
).add_to(coches)
for lat, lng, label, in zip(bici_df.latitud, bici_df.longitud, bici_df['num_expediente']): #dos formas diferentes de llamar a un campo
folium.Marker(
location=[lat, lng],
icon=folium.Icon(color="blue", icon="bicycle", prefix = 'fa'),
popup=label,
).add_to(bicis)
mapa_accidentes